<?php

if (!isset($_SESSION)) {
    @session_start();
}

/**
 * Description of RepoReservas
 *
 * @author  Mariano Renkine
 * @author  Fernando Arau
 */
class RepoReserva extends Repositorio {

    function __construct() {
        $this->tabla = "reserva";
        $this->id = "idReserva";
    }

    function agregar(Reserva $reserva) {
        try {
            $idUsuario = $_SESSION['usuario']->getId();
            $descuento = $reserva->getDescuento() == "" ? "NULL" : $reserva->getDescuento();
            $link = $this->OpenDB();
            $this->beginTransaction();
            $query = "INSERT INTO " . $this->tabla;
            if ($reserva->getCliente() != null) {
                $query .= " (tratamiento, terapeuta, gabinete, usuario, usuarioModificacion, estado, 
            cliente, fechaReserva, fechaCreacion, horaCreacion, descuento, observaciones) VALUES (";
            } else {
                $query .= " (tratamiento, terapeuta, gabinete, usuario, usuarioModificacion, estado, 
            habitacion, nombreHuesped, numeroReservaPMS, fechaReserva, fechaCreacion, horaCreacion, descuento, observaciones ) VALUES (";
            }
//      $query .= " (tratamiento, terapeuta, gabinete, usuario, usuarioModificacion,
//        habitacion, fechaReserva, horaReserva, fechaCreacion, horaCreacion) values (";
            $query .= $reserva->getTratamiento()->getId() . ", ";
            $query .= $reserva->getTerapeuta()->getId() . ", ";
            $query .= $reserva->getGabinete()->getId() . ", ";
            $query .= $idUsuario . ", ";
            $query .= $idUsuario . ", ";
            $query .= "0, ";
            if ($reserva->getCliente() != null) {
                $query .= $reserva->getIdCliente() . ",";
            } else {
                $query .= $reserva->getHabitacion() . ",";
                $query .= "'" . $reserva->getNombreHuesped() . "', ";
                $query .= $reserva->getNumeroReservaPMS() . ",";
            }
            $query .= "'" . $this->SqlDate($reserva->getFechaReserva());
            $query .= " " . $reserva->getHoraReserva() . "',";
            $query .= "GETDATE(),";
            $query .= "GETDATE(),";
            $query .= $descuento . ",";
            $query .= "'" . $reserva->getObservaciones() . "')";
            $result = $this->PostSQL($query);
            if ($result) {
                $result = $this->GetInsertedId();
            }
            $this->commitTransaction();
            return $result;
            $this->CloseDB($link);
        } catch (Exception $ex) {
            return $ex;
        }
    }

    function modificar(Reserva $reserva) {
        try {
            $idUsuario = $_SESSION['usuario']->getId();
            $descuento = $reserva->getDescuento() == "" ? "NULL" : $reserva->getDescuento();
            $link = $this->OpenDB();
            $this->beginTransaction();
            $query = "UPDATE " . $this->tabla . " SET ";
            $query .= "tratamiento = " . $reserva->getTratamiento()->getId() . ", ";
            $query .= "terapeuta = " . $reserva->getIdTerapeuta() . ", ";
            $query .= "gabinete = " . $reserva->getIdGabinete() . ", ";
            $query .= "usuarioModificacion = " . $idUsuario . ", ";
            $query .= "descuento = " . $descuento . ", ";
            $query .= "observaciones = '" . $reserva->getObservaciones() . "', ";
            if ($reserva->getCliente() != null) {
                $query .= "cliente = " . $reserva->getIdCliente() . ", ";
                $query .= "habitacion = NULL";
            } else {
                $query .= "habitacion = " . $reserva->getHabitacion() . ", ";
                $query .= "cliente = NULL";
            }
            $query .= " WHERE " . $this->id . " = " . $reserva->getId();
            $result = $this->PostSQL($query);
            $this->commitTransaction();
            return $result;
            $this->CloseDB($link);
        } catch (Exception $ex) {
            return $ex;
        }
    }

    function buscarReserva(BusquedaReservaDTO $busquedaReservaDto) {
        
    }

    /**
     * Si encuentra reservas para el terapeuta en la fecha indicada devuelve un array con los ids de las reservas,
     * si no encuentra ninguna devuelve false.
     * @param Horario $horario
     * @return array
     * @return bool
     */
    function buscarReservasTerapeuta(Horario $horario) {
        $fecha = $this->SqlDate($horario->getFecha());
        $terapeuta = $horario->getIdTerapeuta();
        $link = $this->OpenDB();
        $result = false;
        $query = "SELECT idReserva, DATEPART(HOUR, fechaReserva) AS hora FROM reserva 
      WHERE terapeuta = " . $terapeuta . " AND DATEADD(dd, 0, DATEDIFF(dd, 0, fechaReserva)) = '" . $fecha . "'";

        if ($horario->getDesde1() != "" && $horario->getHasta1()) {
            $query .= " AND DATEPART(hh,fechaReserva) not between " . $horario->getDesde1() . " AND " . (((int) $horario->getHasta1()) - 1);
        }
        if ($horario->getDesde2() != "" && $horario->getHasta2()) {
            $query .= " AND DATEPART(hh,fechaReserva) not between " . $horario->getDesde2() . " AND " . (((int) $horario->getHasta2()) - 1);
        }
        $query = $this->GetSQL($query);
        $this->CloseDB($link);
        if ($query) {
            $result = array();
            foreach ($query as $reserva) {
                $result[$reserva->hora] = $reserva->idReserva;
            }
        }
        return $result;
    }

    function buscar($id) {
        $link = $this->OpenDB();
        $query = parent::buscar($id);
        $this->CloseDB($link);
        $reserva = new Reserva();
        $reserva->setId($id);
        $repoTratamiento = new RepoTratamiento();
        $repoTerapeuta = new RepoTerapeuta();
        $repoGabinete = new RepoGabinete();
        $reserva->setTratamiento($repoTratamiento->buscar($query[0]->tratamiento));
        $reserva->setVersion($query[0]->version);
        $reserva->setTerapeuta($repoTerapeuta->buscar($query[0]->terapeuta));
        $reserva->setGabinete($repoGabinete->buscar($query[0]->gabinete));

        ///  Timestamp fecha reserva
        $tsFechaRes = strtotime($query[0]->fechaReserva);
        $fechaReserva = $this->SqlDate($query[0]->fechaReserva); // date("Ymd", $tsFechaRes);
        $horaReserva = date("H:i:00", $tsFechaRes);

        $reserva->setFechaReserva($fechaReserva);
        $reserva->setHoraReserva($horaReserva);

        $reserva->setHabitacion($query[0]->habitacion);
        $repoCliente = new RepoCliente();
        $reserva->setCliente($repoCliente->buscar($query[0]->cliente));

        $repoComprobante = new RepoComprobante();
        if ($query[0]->comprobante != null) {
            $reserva->setComprobante($repoComprobante->buscar($query[0]->comprobante));
        } else {
            $reserva->setComprobante(false);
        }

        $reserva->setObservaciones($query[0]->observaciones);
        $reserva->setEstado($query[0]->estado);
        return $reserva;
    }

    function buscarTratamientosDisponibles() {
        
    }

    function buscarTerapeutasGabinestesDisponibles() {
        
    }

    function buscarPorGabineteFecha($gabinete, $fecha, $hora) {
        $link = $this->OpenDB();
        $repoCliente = new RepoCliente();
        $repoGabinete = new RepoGabinete();
        $repoTerapeuta = new RepoTerapeuta();
        $repoTratamiento = new RepoTratamiento();
        $repoUsuario = new RepoUsuario();

        $query = $this->GetSQL("SELECT idReserva, tratamiento, terapeuta, gabinete, usuario, usuarioModificacion, cliente, 
          comprobante, estado, CONVERT(VARCHAR(10), fechaReserva,120) AS fechaReserva, CONVERT(VARCHAR(8), fechaReserva,108) AS horaReserva,1111 fechaCreacion, horaCreacion, habitacion, 
          CONVERT(BIGINT,version) AS version, observaciones  
          FROM reserva 
          WHERE gabinete = " . $gabinete . " AND fechaReserva = '" . $this->SqlDate($fecha) . " $hora'");
        $query = $query[0];
        $this->CloseDB($link);
        if ($query) {
            $reserva = new Reserva();
            $reserva->setEstado($query->estado);
            $reserva->setObservaciones($query->observaciones);
            $reserva->setVersion($query->version);
            $reserva->setFechaReserva($query->fechaReserva);
            $reserva->setGabinete($repoGabinete->buscar($query->gabinete));
            $reserva->setHoraReserva($query->horaReserva);
            $reserva->setId($query->idReserva);
            $reserva->setHabitacion($query->habitacion);
            $reserva->setTerapeuta($repoTerapeuta->buscar($query->terapeuta));
            $reserva->setTratamiento($repoTratamiento->buscar($query->tratamiento));
            $reserva->setCliente($repoCliente->buscar($query->cliente));
            $reserva->setUsuario($repoUsuario->buscar($query->usuario));
            $usuarioMod = $query->usuario == $query->usuarioModificacion ? $reserva->getUsuario() : $repoUsuario->buscar($query->usuarioModificacion);
            $reserva->setUsuarioModificacion($usuarioMod);
            return $reserva;
        } else {
            return false;
        }
    }

    function buscarPorComprobante(Comprobante $comprobante) {
        $link = $this->OpenDB();
        $repoCliente = new RepoCliente();
        $repoGabinete = new RepoGabinete();
        $repoTerapeuta = new RepoTerapeuta();
        $repoTratamiento = new RepoTratamiento();
        $repoUsuario = new RepoUsuario();
        $query = "SELECT idReserva, tratamiento, terapeuta, gabinete, usuario, usuarioModificacion, 
      cliente, comprobante, estado, CONVERT(VARCHAR(10), fechaReserva,120) AS fechaReserva, 
      CONVERT(VARCHAR(8), fechaReserva,108) AS horaReserva, fechaCreacion, horaCreacion, 
      habitacion, CONVERT(BIGINT, version) AS version, nombreHuesped, numeroReservaPMS, observaciones FROM " . $this->tabla . " WHERE comprobante = " . $comprobante->getId();
        $reservas = $this->GetSQL($query);
        $this->CloseDB($link);
        if ($reservas) {
            $reserva = new Reserva();
            $reservaObj = $reservas[0];

            if ($reservaObj->cliente != "")
                $reserva->setCliente($repoCliente->buscar($reservaObj->cliente));
            else
                $reserva->sethabitacion($reservaObj->habitacion);

            $reserva->setEstado($reservaObj->estado);
            $reserva->setObservaciones($reservaObj->observaciones);
            $reserva->setVersion($reservaObj->version);
            $reserva->setFechaReserva($reservaObj->fechaReserva);
            $reserva->setGabinete($repoGabinete->buscar($reservaObj->gabinete));
            $reserva->setHoraReserva($reservaObj->horaReserva);
            $reserva->setNombreHuesped($reservaObj->nombreHuesped);
            $reserva->setNumeroReservaPMS($reservaObj->numeroReservaPMS);
            $reserva->setId($reservaObj->idReserva);
            $reserva->setTerapeuta($repoTerapeuta->buscar($reservaObj->terapeuta));
            $reserva->setTratamiento($repoTratamiento->buscar($reservaObj->tratamiento));
            $reserva->setUsuario($repoUsuario->buscar($reservaObj->usuario));
            $reserva->setUsuarioModificacion($repoUsuario->buscar($reservaObj->usuarioModificacion));
            return $reserva;
        } else {
            return false;
        }
    }

    function crearReserva() {
        
    }

    function asignarComprobante(Comprobante $comprobante) {
        // No se inicializa conexión ya que únicamente se utiliza en transacción
        // con agregarComprobante(...).
        $query = "UPDATE reserva SET comprobante = " . $comprobante->getId() . ",
              estado = " . CHECKIN . " WHERE idReserva = " . $comprobante->getIdReserva();
        return $this->PostSQL($query);
    }
    
    function cancelar($id) {
        $link = $this->OpenDB();
        $query = "UPDATE reserva SET estado = '" . CANCELADA . "' WHERE idReserva = " . $id;
        $return = $this->PostSQL($query);
        $this->CloseDB($link);
        return $return;
    }
}

?>
